package com.rainman.mybatisplus.core.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.rainman.mybatisplus.joinparam.JoinParam;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 拓展连表方法
 *
 * @author lqy
 * @param <T>
 */
public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {

    /**
     * 根据 Wrapper 条件，查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类
     * @param joinParam 连表参数
     */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper, @Param("jp") JoinParam joinParam);


    /**
     * 根据 Wrapper 条件，查询全部记录（并翻页）。这个没有需要自行组装page
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类
     * @param joinParam 连表参数
     */
    List<Map<String, Object>> selectMaps(IPage<? extends Map<String, Object>> page,
                                         @Param(Constants.WRAPPER) Wrapper<T> queryWrapper
            , @Param("jp")JoinParam joinParam);


    /**
     * 根据 Wrapper 条件，查询全部记录（并翻页）
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类
     * @param joinParam 连表参数
     */
    default <P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper, @Param("jp")JoinParam joinParam) {
        page.setRecords(selectMaps(page, queryWrapper,joinParam));
        return page;
    }

    /**
     * 根据 Wrapper 条件，查询全部记录（并翻页）
     *
     *
     * @param queryWrapper 实体对象封装操作类
     * @param joinParam 连表参数
     */
    default Map<String, Object> selectMapsOne( @Param(Constants.WRAPPER) Wrapper<T> queryWrapper, @Param("jp")JoinParam joinParam) {

        List<Map<String, Object>> maps = selectMaps(queryWrapper, joinParam);
        if(maps!=null&&maps.size()==1){

            return maps.get(0);
        }
        if(maps!=null&&maps.size()>1){
            throw new RuntimeException(" selectMapsOne but more than one record");
        }


        return null;
    }
}
